package org.capgemini.tienda.actions;

import java.util.Enumeration;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import org.capgemini.tienda.service.Carrito;
import org.capgemini.tienda.service.ProductosDelegateImpl;
import org.capgemini.tienda.service.TiendaDelegateFactory;
import org.capgemini.tienda.utils.ContextKeys;
import org.capgemini.tienda.utils.RequestKeys;
import org.capgemini.tienda.utils.SessionKeys;
import org.capgemini.tienda.vo.CarritoProductoVO;
import org.capgemini.tienda.vo.ProductoVO;


public class CarritoAction extends DispatchAction{

	protected static Logger log= Logger.getLogger(CarritoAction.class);
	
	public ActionForward add(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		final ServletContext context=request.getSession().getServletContext();
		Carrito carrito=getCarrito(request);
		ProductosDelegateImpl productosDelegateImpl=(ProductosDelegateImpl) context.getAttribute(ContextKeys.PRODUCTOS_DELEGATE);

		ProductoVO producto=null;
		
		final String idProducto = request.getParameter(RequestKeys.ID_PRODUCTO);
	
		if(idProducto!=null){
			producto=productosDelegateImpl.getDetalleProducto(idProducto);
		}	
		
		if(producto!=null){
			CarritoProductoVO carritoProducto=new CarritoProductoVO();
			carritoProducto.setProducto(producto);
			carrito.addProducto(carritoProducto);
		}
		
		
//		request.setAttribute(RequestKeys.LISTA_PRODUCTOS, carrito.getProductos());
		request.getSession().setAttribute(SessionKeys.CARRITO, carrito);
		
		request.setAttribute(RequestKeys.ID_PRODUCTO, idProducto);
		
		return mapping.findForward("add");
	}
	public ActionForward update(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		Carrito carrito=getCarrito(request);
		
		//Si pulso actualizar
		if(request.getParameter("actualizar")!=null){
			updateCantidades(request);
			updateProductos(request);
			request.setAttribute(RequestKeys.LISTA_PRODUCTOS, carrito.getProductos());
			//Vuelvo a carrito
			return mapping.findForward("update");
		}
		
		//Si pulso comprar
		if(request.getParameter("comprar")!=null){
			
			request.setAttribute(RequestKeys.LISTA_PRODUCTOS, carrito.getProductos());
			if(carrito.getSize()<1){
				//Si no hay productos en el carrito vuelvo a carrito
				return mapping.findForward("update");
			}
			//voy a la pagina de pedido
			return mapping.findForward("pedido");
		}
		
		//Meto la lista de productos del carrito en request
		request.setAttribute(RequestKeys.LISTA_PRODUCTOS, carrito.getProductos());
		return mapping.findForward("update");
	}
		
	private Carrito getCarrito(HttpServletRequest request){
		final HttpSession session=request.getSession();
		
		Carrito carrito=(Carrito) session.getAttribute(SessionKeys.CARRITO);
		if(carrito==null){
			carrito=new Carrito();
			session.setAttribute(SessionKeys.CARRITO, carrito);
		}
		
		return carrito;
	}
	
	private void updateCantidades(HttpServletRequest request){
		Carrito carrito=getCarrito(request);
		
		Enumeration<String> parametros=request.getParameterNames();
		
		while (parametros.hasMoreElements()){
			String cadena=parametros.nextElement();
			String cantidad=request.getParameter(cadena);
			if (cadena.startsWith("cantidad_")){
				carrito.updateCantidad(Integer.parseInt(cantidad),cadena.substring(9));
			}
			
		}
	}
	
	private void updateProductos(HttpServletRequest request){
		Carrito carrito=getCarrito(request);
		String[] idProductos= (String[]) request.getParameterValues(RequestKeys.BORRAR);
		
		if(idProductos!=null){
			for (String s: idProductos){
				carrito.removeProducto(s);
			}
		}	
	}
}
